package com.foodcommunity.mapper;

import com.foodcommunity.dto.FoodPostDTO;
import com.foodcommunity.entity.FoodPost;
import com.foodcommunity.vo.PostVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

@Mapper
public interface FoodPostMapper {
    /**
     * 查询热门美食日记
     */
    List<FoodPostDTO> selectHotPosts();

    /**
     * 查询更多美食日记
     */
    List<FoodPostDTO> selectMorePosts(@Param("offset") int offset, @Param("limit") int limit);

    /**
     * 根据用户ID查询美食日记
     */
    List<FoodPost> selectByUserId(@Param("userId") Long userId);

    /**
     * 根据ID查询美食日记
     */
    FoodPost selectById(@Param("id") Long id);

    /**
     * 插入美食日记
     */
    int insert(FoodPost post);

    /**
     * 更新美食日记
     */
    int update(FoodPost post);

    /**
     * 更新美食日记浏览量
     */
    int updateViews(@Param("id") Long id, @Param("views") Integer views);

    /**
     * 更新美食日记点赞数
     */
    int updateLikes(@Param("id") Long id, @Param("likes") Integer likes);

    /**
     * 删除美食日记
     */
    int delete(@Param("id") Long id);

    List<PostVO> selectPostList();

    /**
     * 根据分类ID推荐帖子
     */
    List<Map<String, Object>> selectRecommendedPostsByCategories(
            @Param("categoryIds") List<Long> categoryIds, 
            @Param("userId") Long userId, 
            @Param("limit") int limit);

    /**
     * 根据标签ID推荐帖子
     */
    List<Map<String, Object>> selectRecommendedPostsByTags(
            @Param("tagIds") List<Long> tagIds, 
            @Param("userId") Long userId, 
            @Param("limit") int limit);

    /**
     * 查询热门帖子（排除指定用户的帖子）
     */
    List<Map<String, Object>> selectHotPostsExcludeUser(
            @Param("userId") Long userId, 
            @Param("limit") int limit);

    /**
     * 查询热门帖子排行榜
     */
    List<Map<String, Object>> selectHotPostsRanking(int limit);

    /**
     * 查询相关帖子
     */
    List<FoodPostDTO> selectRelatedPosts(@Param("categoryId") Long categoryId, @Param("excludeId") Long excludeId, @Param("limit") int limit);

    /**
     * 根据分类ID查询美食日记（按时间排序）
     */
    List<FoodPostDTO> selectByCategoryOrderByTime(@Param("categoryId") Long categoryId, @Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 根据分类ID查询美食日记（按点赞数排序）
     */
    List<FoodPostDTO> selectByCategoryOrderByLikes(@Param("categoryId") Long categoryId, @Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 根据分类ID查询美食日记（按评论数排序）
     */
    List<FoodPostDTO> selectByCategoryOrderByComments(@Param("categoryId") Long categoryId, @Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 查询美食日记（按时间排序）
     */
    List<FoodPostDTO> selectOrderByTime(@Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 查询美食日记（按点赞数排序）
     */
    List<FoodPostDTO> selectOrderByLikes(@Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 查询美食日记（按评论数排序）
     */
    List<FoodPostDTO> selectOrderByComments(@Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 统计美食日记总数
     */
    int count();
    
    /**
     * 统计指定分类的美食日记总数
     */
    int countByCategory(@Param("categoryId") Long categoryId);
    
    /**
     * 获取所有美食日记（包含作者和分类信息）
     */
    List<FoodPostDTO> selectAllPostsWithInfo(@Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 搜索美食日记
     */
    List<FoodPostDTO> searchPosts(@Param("keyword") String keyword, @Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 统计搜索结果数量
     */
    int countSearchPosts(@Param("keyword") String keyword);
}